from langchain_core.prompts import ChatPromptTemplate

from common.pptx_common import get_duration_pydub
from config.template import text_polish_template
from utils.log import logger
from utils.llm_generate import single_llm
import requests
from config.model_config import VOICE_MODEL_URL,VOICE_MODEL_PORT
import os
from config.ppt_config import AUDIO_FOLDER, RESOURCES_FOLDER, PICTURE_FOLDER, VIDEO_FOLDER
import ffmpeg
from pydub import AudioSegment
def text_generate(text: str):
    """
    对传入的文本上传给大模型进行润色
    :param text: 未润色前的文本
    :return:润色后的文本
    """
    input = {
        "text": text
    }
    logger.info(f"进入对文本润色方法,未润色前的文本为:{text}")
    llm = single_llm
    template_prompt = ChatPromptTemplate.from_messages(
        [
            ("system", text_polish_template),
            ("system", "全文文本如下："),
            ("human", "<文本>{text}</文本>"),
        ]
    )
    chain = template_prompt | llm
    res = chain.invoke(input).content
    logger.info(f"润色后的文本为: {res}")
    return res

# text = """
# 风能
# 我国目前的风能资源非常的丰富，在资源储备方面我国的风能资源总量在33.26亿千瓦左右，这种能源的功率高
# 核能
# 现如今的核能利用的主要方式是核裂变和核聚变，并且核裂变技术已经得到了运用，我国已经有了几个大型的核电站。
# 生物能
# 我国的生物能源储存量特别丰厚，因此生物能十分具有开发以及利用价值。这种能源分布范围广、可利用率高。
# """
# res = text_polish(text)
# print(res)


def audio_generate(text: str, ppt_name, slide_index):
    """
    调用cosyvoice服务生成音频
    :param text: 待生成音频的文本
    :return: 语音.wav文件的地址，还有音频的时长
    """
    body = {
        "tts": text,
        "role": "中文女"
    }
    logger.info("开始请求生成语音")
    audio = requests.post(VOICE_MODEL_URL + VOICE_MODEL_PORT + '/api/inference/sft', data=body, stream=True)
    print(type(audio))
    logger.info("请求完毕")
    audio_data = audio.content
    # audiolist.append(audio_data)

    # 存储音频文件的目录
    audio_directory = os.path.join(AUDIO_FOLDER, ppt_name)

    # 确保目录存在
    if not os.path.exists(audio_directory):
        os.makedirs(audio_directory)
    logger.info("开始存储")
    # 生成文件名，并保证音频的格式为wav
    file_extension = "wav"
    file_name = f"{ppt_name}_{slide_index}.{file_extension}"
    print(f"file_name:{file_name}")
    file_path = os.path.join(audio_directory, file_name)
    print(f"file_path:{file_path}")


    # 将音频数据写入文件
    with open(file_path, "wb") as audio_file:
        audio_file.write(audio_data)

    if not os.path.exists(file_path):
        raise FileNotFoundError

    slide_audio_duration = get_duration_pydub(file_path)

    logger.info(f"音频保存至{file_path}")
    return {"file_path": file_path,
            "file_name": file_name,
            "slide_audio_duration": slide_audio_duration}

# text = """
# 让我们从风能说起。我国的风能资源非常丰富，据估算，全国风能资源总量大约在33.26亿千瓦左右。这是一个相当惊人的数字，也说明了风能作为一种高功率的清洁能源，具有巨大的开发潜力。
#
# 接下来我们来看核能。目前，核能的主要利用方式包括核裂变和核聚变。其中，核裂变技术已经成熟并得到了广泛应用。在我国，多个大型核电站的建设与运行，正是核裂变技术成功应用的有力证明。
#
# 最后是生物能。我国在生物能源方面的储量同样十分丰厚，这使得生物能成为一种极具开发和利用价值的能源类型。它的优势在于分布广泛且可利用率高，为我国能源结构的优化提供了重要支持。
# """
# ppt_name = "电力行业PPT"
# slide_index = 1
# audio_generate(text, ppt_name, slide_index)


def create_video(ppt_name, ppt_pages, frame_rate=24):
    """
    创建视频并输出到本地
    :param ppt_pages: ppt页数
    :param ppt_name: ppt的名称，生成的视频名称也和PPT名称一样。
    :param frame_rate: 视频帧率
    :return: “生成成功”
    """

    # 构建image_audio_pairs元组，每个幻灯片图片对应一个wav的音频，形如：[
    #         (f"{PICTURE_FOLDER}\\电力行业PPT\\幻灯片1.JPG", f"{AUDIO_FOLDER}\\电力行业PPT.pptx_1.wav"),
    #         (f"{PICTURE_FOLDER}\\电力行业PPT\\幻灯片2.JPG", f"{AUDIO_FOLDER}\\电力行业PPT.pptx_2.wav"),
    #         (f"{PICTURE_FOLDER}\\电力行业PPT\\幻灯片3.JPG", f"{AUDIO_FOLDER}\\电力行业PPT.pptx_3.wav"),
    #         (f"{PICTURE_FOLDER}\\电力行业PPT\\幻灯片4.JPG", f"{AUDIO_FOLDER}\\电力行业PPT.pptx_4.wav"),
    #         (f"{PICTURE_FOLDER}\\电力行业PPT\\幻灯片5.JPG", f"{AUDIO_FOLDER}\\电力行业PPT.pptx_5.wav"),
    #         (f"{PICTURE_FOLDER}\\电力行业PPT\\幻灯片6.JPG", f"{AUDIO_FOLDER}\\电力行业PPT.pptx_6.wav"),
    #         (f"{PICTURE_FOLDER}\\电力行业PPT\\幻灯片7.JPG", f"{AUDIO_FOLDER}\\电力行业PPT.pptx_7.wav"),
    #         (f"{PICTURE_FOLDER}\\电力行业PPT\\幻灯片8.JPG", f"{AUDIO_FOLDER}\\电力行业PPT.pptx_8.wav"),
    #         (f"{PICTURE_FOLDER}\\电力行业PPT\\幻灯片9.JPG", f"{AUDIO_FOLDER}\\电力行业PPT.pptx_9.wav"),
    #         (f"{PICTURE_FOLDER}\\电力行业PPT\\幻灯片10.JPG", f"{AUDIO_FOLDER}\\电力行业PPT.pptx_10.wav"),
    #         (f"{PICTURE_FOLDER}\\电力行业PPT\\幻灯片11.JPG", f"{AUDIO_FOLDER}\\电力行业PPT.pptx_11.wav"),
    #         (f"{PICTURE_FOLDER}\\电力行业PPT\\幻灯片12.JPG", f"{AUDIO_FOLDER}\\电力行业PPT.pptx_12.wav"),
    #         (f"{PICTURE_FOLDER}\\电力行业PPT\\幻灯片13.JPG", f"{AUDIO_FOLDER}\\电力行业PPT.pptx_13.wav"),
    #         (f"{PICTURE_FOLDER}\\电力行业PPT\\幻灯片14.JPG", f"{AUDIO_FOLDER}\\电力行业PPT.pptx_14.wav"),
    #         (f"{PICTURE_FOLDER}\\电力行业PPT\\幻灯片15.JPG", f"{AUDIO_FOLDER}\\电力行业PPT.pptx_15.wav"),
    #         (f"{PICTURE_FOLDER}\\电力行业PPT\\幻灯片16.JPG", f"{AUDIO_FOLDER}\\电力行业PPT.pptx_16.wav"),
    #         (f"{PICTURE_FOLDER}\\电力行业PPT\\幻灯片17.JPG", f"{AUDIO_FOLDER}\\电力行业PPT.pptx_17.wav")
    #     ]
    image_audio_pairs = []
    # 循环创建元组，塞进列表中
    for index in range(ppt_pages):

        t = (f"{PICTURE_FOLDER}\\{ppt_name}\\幻灯片{index + 1}.JPG", f"{AUDIO_FOLDER}\\{ppt_name}\\{ppt_name}_{index + 1}.wav")
        image_audio_pairs.append(t)


    # 临时文件夹，用于存储处理过程中的文件
    temp_dir = os.path.join(RESOURCES_FOLDER, "temp_files")
    os.makedirs(temp_dir, exist_ok=True)
    gap_path = os.path.join(RESOURCES_FOLDER, "gap.mp3")

    # 存储每个片段的文件名
    video_segments = []

    for idx, (image_path, audio_path) in enumerate(image_audio_pairs):
        # 获取音频时长
        audio = AudioSegment.from_file(audio_path)
        duration = len(audio) / 1000.0  # 转换为秒

        gap = AudioSegment.from_file(gap_path)
        duration2 = len(gap) / 1000.0  # 转换为秒

        total_duration = duration + duration2

        logger.info(f"当前为第{idx + 1}个音频,音频总时长为{total_duration}")

        # 创建图片持续时间等于音频长度 + 空白gap时间长度的视频片段
        temp_video = os.path.join(temp_dir, f"segment_{idx}.mp4")
        logger.info("使用ffmpeg将图片转换为视频片段")
        # 使用ffmpeg将图片转换为视频片段
        stream = ffmpeg.input(image_path, loop=1, t=total_duration)
        stream = ffmpeg.output(stream, temp_video, vcodec='libx264', r=frame_rate, pix_fmt='yuv420p')
        ffmpeg.run(stream, overwrite_output=True)
        logger.info("使用ffmpeg将图片转换为视频片段转换完毕")

        # 将人声音频和gap音频合并
        logger.info("将人声音频和gap音频合并")
        combined_audio = audio + gap  # 将人声音频和gap音频合并
        temp_audio = os.path.join(temp_dir, f"audio_{idx}.mp3")
        combined_audio.export(temp_audio, format="mp3")


        # 将合并后的音频添加到视频片段
        logger.info("将合并后的音频添加到视频片段")
        temp_video_with_audio = os.path.join(temp_dir, f"segment_with_audio_{idx}.mp4")
        # 创建视频流和音频流
        video_stream = ffmpeg.input(temp_video)
        combined_audio_stream = ffmpeg.input(temp_audio)  # 输入合并后的音频流
        # 合并流并指定输出
        stream = ffmpeg.output(video_stream, combined_audio_stream, temp_video_with_audio, vcodec='libx264',
                               acodec='aac', strict='experimental')


        # 运行ffmpeg命令
        ffmpeg.run(stream, overwrite_output=True)
        logger.info("将音频添加到视频片段，添加完毕")

        video_segments.append(temp_video_with_audio)



    # 创建包含所有片段文件名的临时文本文件
    concat_file = os.path.join(temp_dir, "concat.txt")
    with open(concat_file, 'w', encoding='utf-8') as f:
        for segment in video_segments:
            f.write(f"file '{segment}'\n")

    # 合并所有视频片段
    logger.info("合并所有视频片段")
    stream = ffmpeg.input(concat_file, format='concat', safe=0)

    output_path = os.path.join(VIDEO_FOLDER, f"{ppt_name}.mp4")

    stream = ffmpeg.output(stream, output_path, c='copy')
    print(str(stream))
    ffmpeg.run(stream, overwrite_output=True)
    logger.info("合并所有视频片段完毕")

    # 清理临时文件
    for file in video_segments:
        os.remove(file)
    for file in os.listdir(temp_dir):
        os.remove(os.path.join(temp_dir, file))
    os.rmdir(temp_dir)

    return output_path

